package com.ry.bhwktapp.home.ui

/**
 * kotlin演示内联函数的使用
 */
fun main() {
/*    第一种写法
    loginAPI(USER_NAME, USER_PWD,{ msg:String,code:Int ->
        println("最终登录情况如下 $msg 状态码 $code")
    })

    第二种写法（具名参数的方式）
    loginAPI(USER_NAME, USER_PWD,resultLogin = { msg:String,code:Int ->
        println("最终登录情况如下 $msg 状态码 $code")
    })*/

    //第三种写法
    loginAPI(USER_NAME, USER_PWD){ msg:String,code:Int ->
        println("最终登录情况如下 $msg 状态码 $code")
    }
//    综合以上三种方式，还是第三种最好！！

}
//声明账户密码
const val USER_NAME1 = "旺旺旺旺旺旺2"
const val USER_PWD1 = "123456"
//kotlin语言 参数中包含一个函数的用法
//这种使用了lambda表达式作为函数，所有要使用内联函数
//不使用内联函数，会生成各种对象供调用，会增加性能损耗

/*private fun loginAPI(username:String,userPwd:String,resultLogin:(String,Int) -> Unit){//未使用内联函数
    if (username==null||userPwd==null) {
        TODO("用户名或密码为null")
    }

    if (username.length>4&&userPwd.length>4) {
        if(webAPI(username,userPwd)){
            resultLogin("登录成功",200)
        }else{
            resultLogin("登录失败",400)
        }
    }else{
        TODO("用户名或密码非法！")
    }

}*/


//使用内联函数（在修饰符后加上inline）的优势，减少对象生成，优化内存(相当于直接把引用的代码拿过来使用) 没有任何函数开辟、对象开辟的损耗
//使用内联函数(inline)
//总结：如果参数有lambda 尽量使用 inline关键字修饰，这样内部会优化，减少内存开销
private inline fun loginAPI(username:String,userPwd:String,resultLogin:(String,Int) -> Unit){
    if (username==null||userPwd==null) {
        TODO("用户名或密码为null")
    }

    if (username.length>4&&userPwd.length>4) {
        if(webAPI(username,userPwd)){
            resultLogin("登录成功",200)
        }else{
            resultLogin("登录失败",400)
        }
    }else{
        TODO("用户名或密码非法！")
    }

}


//模拟服务器返回 （这种没有使用lambda所以不用使用内联函数）
private fun webAPI(username:String,userPwd:String):Boolean{
    return username=="旺旺旺旺旺旺"&&userPwd=="123456"
}